package br.com.toscano.contpedido.business;

import java.io.BufferedReader;
import java.io.IOException;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.StringTokenizer;

import javax.inject.Inject;

import br.com.toscano.contpedido.domain.LocalProducao;
import br.com.toscano.contpedido.domain.Pedido;
import br.com.toscano.contpedido.domain.PedidoProduto;
import br.com.toscano.contpedido.domain.Produto;
import br.com.toscano.contpedido.domain.StatusPedido;
import br.com.toscano.contpedido.domain.UnidadeMedida;
import br.com.toscano.contpedido.exception.DescricaoException;
import br.com.toscano.contpedido.otd.ProdutoOTD;
import br.com.toscano.contpedido.persistence.LocalProducaoDAO;
import br.com.toscano.contpedido.persistence.PedidoDAO;
import br.com.toscano.contpedido.persistence.ProdutoDAO;
import br.com.toscano.contpedido.persistence.UnidadeMedidaDAO;
import br.com.toscano.contpedido.util.Util;
import br.gov.frameworkdemoiselle.stereotype.BusinessController;
import br.gov.frameworkdemoiselle.template.DelegateCrud;
import br.gov.frameworkdemoiselle.transaction.Transactional;

@BusinessController
public class ProdutoBC extends DelegateCrud<Produto, Long, ProdutoDAO> {
	
	private static final long serialVersionUID = 1L;
	
	@Inject
	private PedidoDAO pedidoDAO;

	@Inject
	private UnidadeMedidaDAO unidadeMedidaDAO;

	@Inject
	private LocalProducaoDAO localProducaoDAO;

	public List<Produto> listarAtivos() {
		return this.getDelegate().listarAtivos();
	}
	
	@Override
	@Transactional
	public void delete(Long id) {
		this.getDelegate().delete(id);
	}

	@Override
	@Transactional
	public void delete(List<Long> ids) {
		// TODO Auto-generated method stub
		for (Long id : ids) {
			this.delete(id);
		}
	}
	
	public List<ProdutoOTD> gerarListagemProdutosUsados(Date dataInicial, Date dataFinal) {
		List<ProdutoOTD> resposta = new ArrayList<ProdutoOTD>();
		
		List<Pedido> pedidos = pedidoDAO.consultarPedidos(null, null, null, null, null,  null, null, null, dataInicial, dataFinal, null, null);
		for (Pedido pedido : pedidos) {
			if (!pedido.getStatusPedido().getId().equals(StatusPedido.CANCELADO)) {
				for (PedidoProduto pp : pedido.getListaPedidoProduto()) {

					ProdutoOTD novo = null;
					for (ProdutoOTD jaCadastrado : resposta) {
						if (jaCadastrado.getIdPedido().equals(pp.getProduto().getId())) {
							novo = jaCadastrado;
							break;
						}
					}
					
					if (novo == null) {
						novo = new ProdutoOTD();
						novo.setDescricaoProduto(pp.getProduto().getDescricao());
						novo.setIdPedido(pp.getProduto().getId());
						resposta.add(novo);
					}
					novo.setQuantidade(novo.getQuantidade().add(pp.getQuantidade()));
					novo.setValorTotal(novo.getValorTotal().add(pp.getValorTotalItem()));
				}
			}
		}
		
		return resposta;
	}
	
	@Transactional
	public List<Produto> importarPlanilha(String separado,BufferedReader in) throws IOException {
		List<Produto> listaProduto = new ArrayList<Produto>();
		
		int quantidadeCampo = 4;
		String linha = null;
		int cont = 1;
		while((linha = in.readLine()) != null) {
			String line = linha;
			if (!line.toLowerCase().startsWith("desc") && !line.toLowerCase().startsWith("desc") ) {
				if (Util.contarSubString(line, separado) < quantidadeCampo) {
					line = line + separado; 
					while (Util.contarSubString(line, separado) < quantidadeCampo) {
						line = line + separado; 
					}
				}
				if (Util.contarSubString(line, separado) != quantidadeCampo) {
					throw new DescricaoException("A linha " + cont + " deveria ter apenas " + quantidadeCampo + " campos !");
				}
				while(line.indexOf(separado
						+ separado ) != -1) {
					line = line.replace(separado + separado ,separado + " " + separado );
				}
			    StringTokenizer st = new StringTokenizer(line, separado);
			    try {
				    String descricao = st.nextToken().trim();
				    String valorS = st.nextToken().trim();
				    String localProducao = st.nextToken().trim();
				    String unidadeMedida = st.nextToken().trim();

				    BigDecimal valor = BigDecimal.ZERO;
				    
				    try {
						valor = new BigDecimal(valorS.replace(",", "."));
					} catch (Exception e) {
					}
				    
			    	UnidadeMedida um = null;
			    	um = unidadeMedidaDAO.consultar(unidadeMedida);
			    	if (um == null) {
			    		throw new DescricaoException("Não foi encontrado a Unidade Medida da linha "  + cont);
			    	}
			    	
			    	LocalProducao lp = null;
			    	if (localProducao != null && !localProducao.trim().equals("")) {
				    	lp = localProducaoDAO.consultar(localProducao);
				    	if (lp == null) {
				    		throw new DescricaoException("Não foi encontrado a Local de Produção da linha "  + cont);
				    	}
			    	}

				    Produto Produto = new Produto();
				    Produto.setUnidadeMedida(um);
				    Produto.setLocalProducao(lp);
				    Produto.setDescricao(descricao);
				    Produto.setValor(valor);

				    listaProduto.add(Produto);
				    
				} catch (java.util.NoSuchElementException e) {
					throw new DescricaoException("Erro ao percorrer a linha " + cont);
				}
			}
		    cont++;
		}
		
		List<Produto> retorno = new ArrayList<Produto>();
		for (Produto coop : listaProduto) {
			retorno.add(this.getDelegate().insert(coop));
		}
		
		return retorno;
	}


}
